<?php

//session_start();

require_once 'fonctionsCRUD.php';
require_once 'fonctionsSQL.php';

/**
 * FONCTION Générer un tableau à partir du CSV
 */
function generTableauCsv($fichier_csv, $debut_classes) {

    /// compter le nombre de lignes du CSV
    $fichier_ouvert = fopen($fichier_csv, "r"); ///// ouverture fichier CSV en lecture seulement
    $contenu_fichier = file_get_contents($fichier_csv);
    $nb_lignes = 1 + substr_count($contenu_fichier, "\n");

    $i = 1;

    while (!feof($fichier_ouvert)) { ///// boucle pour remplir tableaucsv avec les donnees du CSV
        $champs_csv = fgetcsv($fichier_ouvert, 0, ";"); /// remplit un tableau $champs_csv avec valeurs (séparées) de chaq ligne
 
        ///  on vide les enregistrements nuls et on remplit le tableaucsv
        $nb_champs_avant = count($champs_csv);

        for ($j = 0; $j <= ($nb_champs_avant); $j++) {
            if (empty($champs_csv[$j])){
//                echo "<br>champcsv n° $j est vide";
                array_splice($champs_csv, $j);
                break;
            }

            $tableau_csv[$i][$j] = utf8_encode($champs_csv[$j]);
        }
        
        $nb_champs_apres = count($champs_csv);
        
//        $valeur_progression = filesize($fichier_csv) * $i / $nb_lignes;

//        echo $i . " (" . ($valeur_progression * 100 / filesize($fichier_csv)) . " %)<br>";
//        echo "<hr>";

        if ($nb_champs_apres > $debut_classes + 1) {
            $debut_classes=  recupIni("debutclasses");
            for ($j = $debut_classes; $j <= $nb_champs_apres - 1; $j++) {
                $tableau_csv[$i][$j] = $champs_csv[$j];
            }
        }
        $i++;
    } ///// fin boucle pour remplir tableaucsv avec CSV  

    fclose($fichier_ouvert);

    return $tableau_csv;
}

/**
 * FONCTION Transformer format date CSV (JJ/MM/AAAA) -> format date BDD (AAAA-MM-JJ)
 * @example [14/07/1789 retourne 1789-07-14]
 */
function jma2amj($jma) {
    $date_tmp = explode("/", $jma);
    return $date_tmp[2] . "-" . $date_tmp[1] . "-" . $date_tmp[0];
}

/**
 * FONCTION Transformer format date BDD (AAAA-MM-JJ) -> format date CSV (JJ/MM/AAAA)
 * @example [1789-07-14 retourne 14/07/1789]
 */
function amj2jma($amj) {
    $date_tmp = explode("-", $amj);
    return $date_tmp[2] . "/" . $date_tmp[1] . "/" . $date_tmp[0];
}

/**
 * FONCTION Rechercher "valeur" dans fichier.ini
 */
function recupIni($recherche) {
    $fichier_ini = "res/csv2xml.ini";

//    var_dump($fichier_ini);

    if (file_exists($fichier_ini) && ($fichier_lu = file($fichier_ini))) { //// ??????? ( "=" dans une condition ??) ?????????????????????
        foreach ($fichier_lu as $ligne_ini) {
            if (!preg_match("#^\[#", $ligne_ini)) { ///// si la ligne ne commence pas par [ (convention de nommage paragraphe d'un fichier ini)
                $champs_ini = explode("=", $ligne_ini);
                if ($champs_ini[0] == $recherche) {
                    return trim($champs_ini[1]);
                }
            }
        }
    } else {
        return "res";
    }
    fclose($fichier_ini);
}

/**
 * FONCTION Connexion à une BDD
 */
function connexionTable($bdd) {

    $serveur=recupIni('serveur');
    
    if (isset($serveur)) {
        $dsn = "mysql:host=" . $serveur.";dbname=" . $bdd; /// ouverture BdD
    } else {
        $dsn = "mysql:host=localhost;dbname=base_csv2xml";
    }
    
    if (isset($_SESSION)) {
        $username = $_SESSION["val1"]; 
        $passwd = $_SESSION["val2"];        
    } else {
        $username = "root"; 
        $passwd = "root";
    }

    try {
        $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
        /// utilisation d'une classe PDO
        
    } catch (PDOException $ex) {
        echo "Erreur connexion Base de Données <br>";
    }

    return $pdo;
}

/**
 * FONCTION serialiser un tableau pour passage en POST
 */
function serialiserTableau($tableau) {

    $tableau_serial = serialize($tableau);
    return htmlspecialchars($tableau_serial);
}

/**
 * FONCTION déserialiser un tableau après passage en POST
 */
function deserialiserTableau($tableau_serial_html) {

    $tableau_serial = htmlspecialchars_decode($tableau_serial_html);
    return unserialize($tableau_serial);
}

/**
 * FONCTION Recupérer l'intitulé pour ILIAS du nom d'un groupe issu du CSV 
 * (tableau de correspondance = table "Groupes")
 */
function csv2ilias($groupe_csv) {

    $pdo_groupe = connexionTable(recupIni('nombdd'));

    $sql_groupe = 'SELECT *';
    $sql_groupe .= ' FROM Groupes';
    $sql_groupe .= ' WHERE libelle_csv_groupe="' . $groupe_csv . '"';

    $req_groupe = $pdo_groupe->query($sql_groupe);
    $result_groupe = $req_groupe->fetchColumn(2);

    return $result_groupe;
}


/**
 * FONCTION analyser le fichier CSV pour determiner si groupe Eleves ou groupe Professeurs
 */
function getGroupe($fichier_csv) {

    $fichier_ouvert = fopen($fichier_csv, "r");
    $champs_csv = fgetcsv($fichier_ouvert, 0, recupIni("separateur"));
    $prefixe = substr($champs_csv[0], 3, 1);
    //fclose($fichiercsv);

    echo "<br> code premier enregistrement : " . $prefixe;
    if (is_numeric($prefixe)) {
        $groupe = "Eleves";
    } else {
        $groupe = "Professeurs";
    }

    return $groupe;
}

/**
 * FONCTION Recuperer les classes d'un professeur dans la BdD
 */
function getClassesBDD($index_prof) {

    $pdo_classes = connexionTable(recupIni('nombdd'));
    $sql_classes = "SELECT * FROM Assignations WHERE professeur_assignation = '$index_prof'";
    $req_classes = $pdo_classes->query($sql_classes);

    $num_colonne = recupIni("debutclasses"); /// index à partir duquel le tableau_classe de sortie va etre rempli
    $tableau_classes = array(); // remet le tableau classes à zero
    while ($result_classes = $req_classes->fetch()) {
        $tableau_classes[$num_colonne] = $result_classes[1];
        $num_colonne++;
    }

    return $tableau_classes;
}

/**
 * FONCTION Recuperer les classes d'un professeur dans le CSV
 */
function getClassesCSV($tableau_csv_prof) {

    $tableau_classes = Array();
    for ($num_colonne = 7; $num_colonne < count($tableau_csv_prof); ++$num_colonne) {
        $tableau_classes[] = $tableau_csv_prof[$num_colonne];
    }

    return $tableau_classes;
}

/**
 * FONCTION Calculer nombre maximum de classes pour chaque action 
 * et donc de colonnes dans les tableaux de listingsCRUD.php
 */
function maxColTableau3D($action, $tableau_general) {

    $nb_classes = Array();
    $num_colonne = 7; ///// 

    while (list($identifiant) = each($tableau_general[$action])) {
        $nb_classes[] = sizeof($tableau_general[$action][$identifiant]) - $num_colonne;
    }

    if ($nb_classes == null)
        $nb_classes = Array(0);

    return max($nb_classes);
}

/**
 * FONCTION Recuperer tableau comprenant le nom des champs de telle table de telle BdD par métadonnées
 */
function nomChamp($bdd, $table) { ///// 
    $pdo_champ = connexionTable("$bdd");
    $sql_champ = "SELECT * FROM " . $table;
    $req_champ = $pdo_champ->query($sql_champ);

    $total_colonnes = $req_champ->ColumnCount();

    for ($compteur_champ = 0; $compteur_champ < $total_colonnes; $compteur_champ++) {
        $metadonnees_champ = $req_champ->getColumnMeta($compteur_champ);
        $nom_champ[] = $metadonnees_champ['name'];
    }

    return $nom_champ;
}

/**
 * FONCTION Comparer le tableau general avec l'ensemble des cases cochées et retourner le tableau general corrigé
 */
function corrigTableauGeneral($tableau_general, $lignes_cochees) { ///// 
    while (list($action) = each($tableau_general)) {
        while (list($identifiant) = each($tableau_general[$action])) {
            $id = $tableau_general[$action][$identifiant][0];
            $flag = false;

            foreach ($lignes_cochees as $valeur_lignes_cochees) {
                if ($id == $valeur_lignes_cochees) {
                    $flag = true;
                    break;
                } else {
                    $flag = false;
                }
            }

            if ($flag != true) {
                unset($tableau_general[$action][$identifiant]);
            }
        }
    }

    return $tableau_general;
}
